/**
 * lilang
 * ConvertThread.java
 * 2013-6-27上午9:40:46
 */
package com.cq.oa.common.thread;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import oa.base.util.DateUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.cq.oa.common.utils.Convert2swf;

/**
 * @author lilang 转换线程
 *
 */
public class ConvertThread extends Thread{
	
	private static final Log logger = LogFactory.getLog(ConvertThread.class);
	
	private ConvertThread(){
		
	}
	private static ConvertThread convertThread;
	
	public static ConvertThread getInstance(){
		if(IS_ERROR){
			convertThread = new ConvertThread();
		}
		if(convertThread==null){
			convertThread = new ConvertThread();
		}
		return convertThread;
	}
	
	/**
	 * 需要 处理的url
	 */
	public static LinkedList<String> urlList = new LinkedList<String>();
	/**
	 * 一次批量处理 5个
	 */
	public static final int SIZE=5;
	
	/**
	 * 每次停顿10秒
	 */
	public static final long STOP_TIME = 10000l;
	/**
	 *  是否开启
	 */
	public static boolean IS_RUN = false;
	/**
	 * 是否出错
	 */
	private static boolean IS_ERROR = false;
	
	private static boolean WAIT_FOR = false;
	/**
	 * 唤醒
	 * 
	 * lilang 
	 * 2013-6-29下午8:26:55
	 */
	public static void restart(){
		if(convertThread!=null && WAIT_FOR){
			logger.info("唤醒睡眠。。。处理中");
			WAIT_FOR = false;
			//convertThread.notify();
		}
	}
	
	/**
	 * 添加队列
	 * @param url
	 * lilang 
	 * 2013-6-27上午9:50:58
	 */
	public static void push(String url){
		urlList.addLast(url);
		logger.info("写入数据:"+DateUtil.getCurrentTime());
		restart();
	}
	/**
	 * 删除第一个
	 * 
	 * lilang 
	 * 2013-6-27上午9:51:52
	 */
	public static void remove(){
		if(!urlList.isEmpty()){
			urlList.removeFirst();
		}
	}
	/**
	 *  取数据
	 * @return
	 * lilang 
	 * 2013-6-27上午9:54:30
	 */
	public synchronized String getData(){
		String result = null;
		if(!urlList.isEmpty()){
			result = urlList.getFirst();
			remove();
		}
		return result;
	}

	@Override
	public void run() {
		logger.info("转换文件线程启动 start...");
		List<String> conver =  new ArrayList<String>();
		IS_RUN = true;
		IS_ERROR = false;
		while (true) {
			//添加数据
			while(conver.size()<SIZE){
				String result = getData();
				//如果没有数据跳出循环
				if(null==result){
					break;
				}
				conver.add(result);
			}
			try {
				//不需要处理 停顿
				if(conver.size()==0){
					logger.info("没有数据需要处理进入睡眠中....");
					WAIT_FOR = true;
					Thread.sleep(10000l);
				}else{
					Convert2swf.convert2Swf(conver);
					logger.info("处理成功:"+DateUtil.getCurrentTime());
					conver.clear();
				}
			} catch (Exception e) {
				logger.error("处理失败请检查:"+e.getMessage());
				if(conver.size()>0){
					conver.remove(0);
				}
				Convert2swf.stopOfficer();
				//IS_ERROR = true;
				//IS_RUN = false;
				e.printStackTrace();
			}
			
		}
		//logger.info("转换文件线程停止 stop...");
	}
}
